package com.lumlord.common.mybatis;

import java.lang.reflect.Field;
import java.util.Date;

import com.lumlord.common.annotation.mybatis.SqlInjection;
import com.lumlord.common.annotation.mybatis.SqlInjectionColumn;
import com.lumlord.common.annotation.mybatis.SqlInjectionType;
import com.lumlord.common.shiro.util.ShiroUtils;
import com.lumlord.util.DateUtils;

import cn.hutool.core.bean.BeanUtil;

/**
 * 
 * @author gpf
 * 
 *
 */
public class SetColumnVal { 
	/**
	 * sql column 字段解析
	 * 
	 * @param sql
	 * @param field
	 * @param bean
	 */
	public static void columnSet(SqlInjection sql, Field field, Object bean) {
		SqlInjectionColumn column = sql.column();
		switch (column) {
		case DATE:
			if (field.getType().equals(java.util.Date.class)) {
				BeanUtil.setFieldValue(bean, field.getName(), new java.util.Date());
			} else if (field.getType().equals(java.sql.Date.class)) {
				BeanUtil.setFieldValue(bean, field.getName(), new java.sql.Date(System.currentTimeMillis()));
			} else if (field.getType().equals(java.lang.String.class)) {
				BeanUtil.setFieldValue(bean, field.getName(),
						DateUtils.format(new Date(), DateUtils.YYYY_MM_DD_HH_MM_SS));
			} else {
				return;
			}
			break;
	/*	case PROJECT: // 注入项目信息
			if (field.getType().equals(java.lang.String.class)) {
				BeanUtil.setFieldValue(bean, field.getName(), "1");
			} else if (field.getType().equals(java.lang.Integer.class)) {
				BeanUtil.setFieldValue(bean, field.getName(), 1);
			}
			break;*/
		case USER: // 注入用户信息
			if (field.getType().equals(java.lang.String.class)) {
				BeanUtil.setFieldValue(bean, field.getName(), ShiroUtils.getUserId().toString());
			} else if (field.getType().equals(java.lang.Integer.class)) {
				BeanUtil.setFieldValue(bean, field.getName(), ShiroUtils.getUserId());
			}
			break;
		case DEF: // 默认值
			Object defVal = sql.defval();
			if(DateUtils.DATE_PATTERN.equals(defVal)) {
				defVal =  DateUtils.format(new Date(), DateUtils.DATE_PATTERN) ;
			}else if(DateUtils.DATE_TIME_PATTERN_HHMMSS.equals(defVal)) {
				defVal =  DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN_HHMMSS) ;
			}else if(DateUtils.DATE_TIME_PATTERN.equals(defVal)) {
				defVal =  DateUtils.format(new Date(), DateUtils.DATE_TIME_PATTERN) ;
			}
			
			
			if (field.getType().equals(java.lang.String.class)) {
				BeanUtil.setFieldValue(bean, field.getName(), defVal);
			} else if (field.getType().equals(java.lang.Integer.class)) {
				BeanUtil.setFieldValue(bean, field.getName(), Integer.parseInt(sql.defval()));
			} else if (field.getType().equals(java.lang.Double.class)) {
				BeanUtil.setFieldValue(bean, field.getName(), Double.parseDouble(sql.defval()));
			} else if (field.getType().equals(java.lang.Long.class)) {
				BeanUtil.setFieldValue(bean, field.getName(), Long.parseLong(sql.defval()));
			} else if (field.getType().equals(java.lang.Byte.class)) {
				BeanUtil.setFieldValue(bean, field.getName(), Byte.valueOf(sql.defval()));
			}
			break;
		default:
			break;
		}
	}

	/**
	 * 入口方法
	 * 
	 * @param field 属性
	 * @param o     对象
	 * @param type  类型
	 */
	public static void execute(Field field, Object o, String SQL, SqlInjectionType type) {
		SqlInjection sql = field.getAnnotation(SqlInjection.class);
		if (null == sql)
			return;

		Object val = BeanUtil.getFieldValue(o, field.getName());
		if (null != val) { // 有值不处理
			return;
		}

		if(instanceOf(sql,type)) {
			SetColumnVal.columnSet(sql, field, o);
		}
	}
	
	
	private static boolean instanceOf(SqlInjection taget,SqlInjectionType type) {
		for(SqlInjectionType t :taget.types()) {
			if(t.name().equals(type.name())) {
				return true;
			}
		}
		
		return false;
	}
	
}
